#include <iostream>
#include <list>  //list的头文件
using namespace std;

/*
	list:链表容器
	函数符究竟需要几个参数(要么一个参数，要么两个参数)
	     方法：看你使用的那个函数的具体功能，通过函数的具体功能你就可以推断需要几个参数
		 举例：
		        例子1：
		          我要使用list中的remove_if(函数符需要几个参数)
			      remove_if的功能是删除容器中的数据，只需要一个参数来遍历容器，符合条件的就删除
			    例子2：
		          我要使用list中的sort(函数符需要几个参数)
			      sort的功能是排序，排序肯定需要两两比较，因此需要两个参数
*/

//函数符的第一种情况：类重载了圆括号，这个类的对象就具备了函数调用类似的写法
class Test
{
public:
	bool operator()(int &x) //参数类型必须跟你的容器类型保持一致
	{
		cout<<"参数x会自动帮你遍历容器l1里面的数据： "<<x<<endl;
		if(x>60)
			return true;
		else
			return false;
	}
};

class Mysort
{
public:
	bool operator()(int n1,int n2)
	{
		//我想降序  
		//n1代表前面的数  n2代表后面的数
		return n1>n2;
	}
};

int main()
{
	//创建list对象
	list<int> l1={10,4,78,12,100,1,46,78,78,78,78,123,78,78,12,10,10,12};
	list<int> l2={3,15,49,107};
	
	list<int> l3={96,78,45,10};
	list<int> l4={107,49,15,3};
	
	//插入一些数据
	//l1.push_back(15);
	//l1.push_back(45);
	//l1.push_back(85);
	//l1.push_back(859);
	
	//合并merge
	/*
		 merge()  合并链表，list1.merge(list2);  
		 list1和list2必须先排好序(自带的sort方法)，否则结果不确定，list1和list2必须都是升序或者降序
		 如果是升序，那么合并之后list1里面依然是升序，同时清空list2，如果是降序，那么合并之后list2会放到list1的后面，同时清空list2
	*/
	// l1.merge(l2);
	// for(auto x:l1)
		// cout<<"合并之后l1里面是: "<<x<<endl;
	// for(auto x:l2)
		// cout<<"合并之后l2里面是: "<<x<<endl;
	// l3.merge(l4);
	// for(auto x:l3)
		// cout<<"合并之后l3里面是: "<<x<<endl;
	// for(auto x:l4)
		// cout<<"合并之后l4里面是: "<<x<<endl;
	
	//删除，带条件的删除
	//l1.remove(45); 
	//for(auto x:l1)
		//cout<<"删除45之后l1里面是: "<<x<<endl;
	/*
		void remove_if(函数符);
		知识1：类对象t1会通过operator()(int &x)自动遍历容器l1
		知识2：如果operator()(int &x)返回true，对应的x会被删除
		       如果operator()(int &x)返回false，对应的x会被保留在容器中
	*/
	// Test t1;
	// l1.remove_if(t1);
	// for(auto x:l1)
		// cout<<"删除之后l1里面是: "<<x<<endl;
	
	//排序
	//l1.sort(); //默认按照升序排列
	//函数对象：类重载了圆括号
	//Mysort s;
	//l1.sort(s); //降序排序
	
	//for(auto x:l1)
		//cout<<"排序之后l1里面是: "<<x<<endl;
	
	//把list对象插入到pos的前面，对象被清空
	/*
		注意注意注意：
		     迭代器是个模板类
			 迭代器本质是把C语言的指针封装成了模板类
			 迭代器能否做加法，做减法运算，取决于该迭代器中是否重载了加法(operator+)或者减法(operator-)
	          operator+    
			  operator++   
			  operator+=   
	*/
	// auto it=l1.begin();
	// it++;
	// it++;
	// it++;
	// l1.splice(it,l2);
	// for(auto x:l1)
		// cout<<"插入之后l1里面是: "<<x<<endl;
	// for(auto x:l2)
		// cout<<"插入之后l2里面是: "<<x<<endl;
	
	//去除连续重复的元素
	l1.unique();
	for(auto x:l1)
		cout<<"去除连续重复的元素之后l1里面是: "<<x<<endl;
	
}